package com.hmall.item.web.controller;


import com.hmall.domain.constant.MqConstant;
import com.hmall.domain.dto.PageDTO;
import com.hmall.domain.pojo.Item;
import com.hmall.item.service.IItemService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

/**
 * 商品web层控制器
 *
 * @author xiaojiangshi
 */
@Slf4j
@RestController
@RequestMapping("/item")
public class ItemController {

    @Autowired
    private IItemService itemService;
    @Autowired
    private RabbitTemplate rabbitTemplate;

    /**
     * 分页功能
     *
     * @param page 当前页码
     * @param size 页面大小
     * @return 分页数据
     */
    @GetMapping("/list")
    public PageDTO<Item> list(@RequestParam("page") Integer page, @RequestParam("size") Integer size) {
        log.info("当前页为：[{}]，每页最大条数：[{}]", page, size);

        return itemService.pageList(page, size);
    }

    /**
     * 根据id查找商品
     *
     * @param id 商品id
     * @return 商品对象
     */
    @GetMapping("/{id}")
    public Item findById(@PathVariable Long id) {
        log.info("查询商品id为：[{}]", id);

        return itemService.getById(id);
    }

    /**
     * 新增商品
     *
     * @param item 新增商品数据
     * @return 是否新增成功
     */
    @PostMapping
    public boolean save(@RequestBody Item item) {
        log.info("保存的商品数据为：[{}]", item.toString());

        rabbitTemplate.convertAndSend(MqConstant.ITEM_EXCHANGE, MqConstant.ITEM_INSERT_ROUT, item.getId().toString());
        return itemService.save(item);
    }

    /**
     * 根据商品id修改商品状态
     *
     * @param id     商品id
     * @param status 商品状态，1为上架，2为下架
     * @return 是否修改成功
     */
    @PutMapping("/status/{id}/{status}")
    public boolean updateStatusById(@PathVariable Long id, @PathVariable Integer status) {
        log.info("修改的商品id为：[{}]，修改商品的状态为：[{}]，1为上架，2为下架，3为删除", id, status);
        if (status == 1) {
            rabbitTemplate.convertAndSend(MqConstant.ITEM_EXCHANGE, MqConstant.ITEM_INSERT_ROUT, id.toString());
        } else if (status == 2) {
            rabbitTemplate.convertAndSend(MqConstant.ITEM_EXCHANGE, MqConstant.ITEM_DELETE_ROUT, id.toString());
        }
        return itemService.updateStatusById(id, status);
    }

    /**
     * 根据状态修改商品信息
     *
     * @param item 修改的商品信息
     * @return 是否修改成功
     */
    @PutMapping
    public boolean updateByStatus(@RequestBody Item item) {
        log.info("修改的商品信息为：[{}]", item.toString());

        rabbitTemplate.convertAndSend(MqConstant.ITEM_EXCHANGE, MqConstant.ITEM_INSERT_ROUT, item.getId().toString());
        return itemService.updateByStatus(item);
    }


    /**
     * 根据id删除商品
     *
     * @param id 商品id
     * @return 是否删除成功
     */
    @DeleteMapping("/{id}")
    public boolean deleteById(@PathVariable Long id) {
        log.info("删除的商品id为：[{}]", id);

        rabbitTemplate.convertAndSend(MqConstant.ITEM_EXCHANGE, MqConstant.ITEM_DELETE_ROUT, id.toString());
        return itemService.removeByIdAndStatus(id);
    }


    /**
     * 根据id和订单商品数量，减少库存
     *
     * @param itemId 商品id
     * @param num    商品数量
     * @param status 订单状态
     */
    @PutMapping("/reduce")
    public void reduceIvo(Long itemId, Integer num, Integer status) {
        log.info("商品id为：[{}]，减少的库存为：[{}]", itemId, num);

        itemService.reduceIvoById(itemId, num, status);
    }
}
